package cn.jji8.patternLogin.spigot.login;

import cn.jji8.patternLogin.spigot.data.Data;
import cn.jji8.patternLogin.spigot.PatternLogin;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.List;

/**
 * 主要用于出来任务
 * */
public class LoginTask {
    //登录之后的任务列表
    public static List<LoginTask.Task> loginBeforeTask = new ArrayList<>();
    //登录之前的任务列表
    public static List<LoginTask.Task> loginAfterTask = new ArrayList<>();
    /**
     * 登录之后任务
     * */
    static void loginBefore(Player player){
        //不能成为模块注册的必须运行的任务
        LoginNews.loginBefore(player);//传递给消息处理器
        Bukkit.getServer().getScheduler().runTask(PatternLogin.getMain(),()-> {
            //登录超过返回上次下线时位置
            if(Configuring.logician){
                //从数据库加载数据可能存在延迟，不能在主线程
                Location location = Data.getLocation(player.getName());
                if(location==null){
                    //noinspection ConstantConditions
                    location = player.getLocation().getWorld().getSpawnLocation();
                }
                player.teleport(location);
            }
            if(Configuring.loginStillLoanword){
                if(player.getWorld().equals(LoginWorld.getLoginWord())){
                    World world = Bukkit.getWorld(Configuring.loginTPotherWord);
                    if(world==null){
                        System.out.println("登录后还在登录世界就传送到的世界'"+Configuring.loginTPotherWord+"'无效");
                        return;
                    }
                    player.teleport(world.getSpawnLocation().add(0.5,0.5,0.5));
                }
            }
        });

        //运行注册的任务
        for (Task task : loginBeforeTask) {
            task.run(player);
        }
    }
    /**
     * 登录之前任务
     * */
    static void loginAfter(Player player){
        LoginNews.loginAfter(player);//传递给消息处理器
        for (Task task : loginAfterTask) {
            task.run(player);
        }
    }
    /**
     * 代表一个任务，可以注册到登录之前或登录之后运行
     * */
    static abstract class Task{
        /**
         * 执行任务调用的方法，必须实现此方法
         * */
        abstract void run(Player player);
    }
}
